package com.dlc.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dlc.shop.bean.dto.StockPointSkuDTO;
import com.dlc.shop.bean.model.StockPointSku;
import com.dlc.shop.bean.vo.StockPointSkuVO;
import com.dlc.shop.common.util.PageParam;

import java.util.List;

/**
 *
 *
 * @author FrozenWatermelon
 * @date 2023-11-09 18:00:43
 */
public interface StockPointSkuService extends IService<StockPointSku> {

    /**
     * 分页获取列表
     * @param pageDTO 分页参数
     * @return 列表分页数据
     */
    IPage<StockPointSku> page(PageParam pageDTO);

    /**
     * 根据id获取
     *
     * @param stockPointSkuId id
     * @return
     */
    StockPointSku getByStockPointSkuId(Long stockPointSkuId);

    /**
     * 保存
     * @param stockPointSku
     */
    void insert(StockPointSku stockPointSku);

    /**
     * 更新
     * @param stockPointSku
     */
    void update(StockPointSku stockPointSku);

    /**
     * 根据id删除
     * @param stockPointSkuId id
     */
    void deleteById(Long stockPointSkuId);

    /**
     * 根据id集合删除
     * @param stockPointSkuIds 关联id集合
     */
    void deleteByIds(List<Long> stockPointSkuIds);

    /**
     * 根据商品id删除
     * @param prodId 商品id
     */
    void deleteBySpuId(Long prodId);

    /**
     * 根据关联库存数据id批量删除
     * @param stockPointSkuIdList
     */
    void batchDeleteByStockPointSkuIdList(List<Long> stockPointSkuIdList);


    /**
     * 批量保存库存点和商品关联
     * @param stockPointDTOList
     */
    boolean batchSave(List<StockPointSkuDTO> stockPointDTOList);

    /**
     * 根据skuid批量获取关联数据
     * @param skuIds
     * @return
     */
    List<StockPointSkuVO> listBySkuIds(List<Long> skuIds);

    /**
     * 根据skuid批量获取关联数据
     * @param skuIds
     * @return
     */
    List<StockPointSkuVO> listPointIdsBySkuIds(List<Long> skuIds);

    /**
     * 修改库存商品关联
     * @param stockPointDTOList
     * @param isUpdate true修改  false新增
     */
    void changeStockPoint(List<StockPointSkuDTO> stockPointDTOList, boolean isUpdate);

    /**
     * 根据库存点id获取关联数据
     * @param stockPointId
     * @return
     */
    List<StockPointSkuVO> listByPointId(Long stockPointId);

    /**
     * 根据skuid和库存点id删除数据
     * @param skuId
     * @param stockPointId
     */
    void removeBySkuIdAndPointId(Long skuId, Long stockPointId);

    /**
     * 获取指定sku的仓库列表
     * @param skuIds
     * @return
     */
    List<StockPointSkuVO> listPointBySkuIds(List<Long> skuIds);

    /***
     * 根据库存点id修改库存模式
     * @param stockPointId
     * @param stockMode
     */
    void updateStockMode(Long stockPointId, Integer stockMode);

    /**
     * 过滤被删除的库存和门店，以及被修改为共享模式的门店
     * @param stockPointSkuList
     * @return
     */
    List<StockPointSku> filtePoint(List<StockPointSku> stockPointSkuList);

    /**
     * 获取库存点skuVO集合
     * @param stockPointSkuDTO 库存点skuDTO
     * @return 库存点sku集合
     */
    List<StockPointSkuVO> listStockPointSku(StockPointSkuDTO stockPointSkuDTO);

    /**
     * 检查库存点集合是否含有该sku集合
     * @param stockPointIds 库存点id集合
     * @param skuIds skuId集合
     * @return 包含的skuId集合
     */
    List<Long> checkStockPointContainSku(List<Long> stockPointIds, List<Long> skuIds);

    /**
     * 更新库存点和商品关系（删除库存为0的关联数据，库存减少后调用）
     * @param stockPointIds 库存点id集合
     * @param skuIds 商品skuId集合
     */
    void updateStockPointSkuRelate(List<Long> stockPointIds, List<Long> skuIds);
}
